<?php
namespace app\service\Protocol;

/**
 * MQTTX协议适配器
 * 实现新的MQTTX MQTT协议
 */
class Vendor2Protocol implements ProtocolInterface
{
    /**
     * 协议名称
     */
    private const PROTOCOL_NAME = 'Vendor2 (MQTTX)';

    /**
     * 协议版本
     */
    private const PROTOCOL_VERSION = '1.0';

    /**
     * 动态主题配置（从HTTP API获取）
     * @var array
     */
    private $topicConfig = [];

    /**
     * 构造函数
     */
    public function __construct()
    {
        // 初始化时可以加载配置
        $this->loadTopicConfig();
    }

    /**
     * 加载主题配置
     * 从缓存或HTTP API获取
     */
    private function loadTopicConfig(): void
    {
        // TODO: 从缓存或HTTP API获取配置
        // 这里先使用默认值
        $this->topicConfig = [
            'topicIn' => 'rziot/zftx_w06/cmd/{IMEI}',
            'topicOut' => 'rziot/zftx_w06/{IMEI}/result'
        ];
    }

    /**
     * 构建指令消息
     *
     * @param string $deviceId 设备IMEI
     * @param int $type 指令类型
     * @param array $params 指令参数
     * @return array MQTT消息数组
     */
    public function buildCommand(string $deviceId, int $type, array $params): array
    {
        $topic = $this->getDownlinkTopic($deviceId);
        $message = $this->buildCommandByType($type, $params);

        return [
            'topic' => $topic,
            'message' => json_encode($message, JSON_UNESCAPED_UNICODE)
        ];
    }

    /**
     * 根据指令类型构建消息
     * MQTTX协议直接使用字段，无需cmds包装
     * 
     * @param int $type 指令类型
     * @param array $params 参数
     * @return array 消息数组
     */
    private function buildCommandByType(int $type, array $params): array
    {
        $message = [];

        switch ($type) {
            case 1: // 修改WiFi信息（2.4G）
                $message = [
                    'ssid' => $params['hotspot_name'] ?? '',
                    'password' => $params['hotspot_password'] ?? '',
                    'hidden' => $params['hotspot_whether_hide'] ?? 0,
                    'status' => $params['status'] ?? 1
                ];
                break;

            case 2: // 切换SIM卡
                $message = [
                    'simSwitch' => $params['sim_id'] ?? 0
                ];
                break;

            case 3: // 设备重启
                $message = [
                    'reboot' => 1
                ];
                break;

            case 4: // 网络限速
                $message = [
                    'speed_downlink' => $params['speed_downlink'] ?? 0,
                    'speed_uplink' => $params['speed_uplink'] ?? 0
                ];
                break;

            case 5: // 恢复出厂设置（MQTTX无对应指令）
                break;

            case 6: // 修改WiFi显隐
                $message = [
                    'hidden' => $params['hidden'] ?? 0
                ];
                break;

            case 7: // 修改WiFi信息（5G）
                $message = [
                    'status_5g' => $params['status_5g'] ?? 1,
                    'ssid_5g' => $params['ssid_5g'] ?? '',
                    'password_5g' => $params['password_5g'] ?? '',
                    'hidden_5g' => $params['hidden_5g'] ?? 0
                ];
                break;

            case 8: // 上报间隔设置
                $message = [
                    'nextRptTime' => $params['nextRptTime'] ?? 300000
                ];
                break;

            case 9: // 固件下载
                $message = [
                    'firmware_url' => $params['firmware_url'] ?? ''
                ];
                break;

            default:
                break;
        }

        return $message;
    }

    /**
     * 获取下行主题
     *
     * @param string $deviceId 设备IMEI
     * @return string MQTT主题
     */
    public function getDownlinkTopic(string $deviceId): string
    {
        // 替换{IMEI}为实际的设备IMEI
        return str_replace('{IMEI}', $deviceId, $this->topicConfig['topicIn'] ?? 'rziot/zftx_w06/cmd/{IMEI}');
    }

    /**
     * 获取上行主题
     *
     * @param string $deviceId 设备IMEI
     * @return string MQTT主题
     */
    public function getUplinkTopic(string $deviceId): string
    {
        // 替换{IMEI}为实际的设备IMEI
        return str_replace('{IMEI}', $deviceId, $this->topicConfig['topicOut'] ?? 'rziot/zftx_w06/{IMEI}/result');
    }

    /**
     * 获取协议名称
     * 
     * @return string
     */
    public function getName(): string
    {
        return self::PROTOCOL_NAME;
    }

    /**
     * 获取协议版本
     * 
     * @return string
     */
    public function getVersion(): string
    {
        return self::PROTOCOL_VERSION;
    }

    /**
     * 设置主题配置
     * 
     * @param array $config 配置数组
     */
    public function setTopicConfig(array $config): void
    {
        $this->topicConfig = $config;
    }
}

